package com.threadBase.demo01_establish;


import java.util.concurrent.*;

/**
 * 创建线程方法三：实现Callable接口
 * 1、创建步骤
 *  （1）创建一个类并实现Callable接口
 *  （2）重写call()方法，将所要完成的任务的代码写进call()方法中，需要注意的是call()方法有返回值，并且可以抛出异常
 *  （3）如果想要获取运行该线程后的返回值，需要创建Future接口的实现类的对象，即FutureTask类的对象，调用该对象的get()方法可获取call()方法的返回值
 *  （4）使用Thread类的有参构造器创建对象，将FutureTask类的对象当做参数传进去，然后调用start()方法开启并运行该线程。
 */
public class Method_Callable {
    public static void main(String[] args) throws Exception {
        //标记主线程

        // 再次测试
        System.out.println("主线程："+ Thread.currentThread().getName());
        //创建Callable接口实现类对象
        CallableImpl callable = new CallableImpl();
        //创建FutureTask的对象
        FutureTask<String> task = new FutureTask<>(callable);
        //创建Thread类的对象
        Thread thread = new Thread(task);
        //开启线程
        thread.start();
        //获取call()方法的返回值，即线程运行结束后的返回值
        String result = task.get();
        System.out.println(result);
    }

    /**
     *
     */
    static class CallableImpl implements Callable<String>{
        @Override
        public String call() {
            System.out.println("子线程："+ Thread.currentThread().getName());
            return "我是Callable方法子线程！";
        }
    }
}
